From gtoevan@gmx.net: Add support for writing Garmin tracks.
authorrobertl <robertl@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Fri, 6 Feb 2004 04:02:05 +0000 (04:02 +0000)
committerrobertl <robertl@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Fri, 6 Feb 2004 04:02:05 +0000 (04:02 +0000)
gpsbabel/garmin.c
gpsbabel/jeeps/gpsmem.c
gpsbabel/route.c

index 80b00027bd5b6ccfebfc1bb60db7305c68d07155..4e1a88b9284ee307271bebfef8a037043b799fec 100644 (file)
@@ -30,6 +30,8 @@ static const char *portname;
 static void *mkshort_handle;
 GPS_PWay *tx_routelist;
 GPS_PWay *cur_tx_routelist_entry;
+GPS_PTrack *tx_tracklist;
+GPS_PTrack *cur_tx_tracklist_entry;
 
 static void
 rw_init(const char *fname)
@@ -169,6 +171,9 @@ track_read(void)
 
        ntracks = GPS_Command_Get_Track(portname, &array);
 
+       if ( ntracks == 0 )
+               return;
+
        for(i = 0; i < ntracks; i++) {
                waypoint *wpt;
 
@@ -454,6 +459,58 @@ route_write(void)
        GPS_Command_Send_Route(portname, tx_routelist, n);
 }
 
+static void
+track_hdr_pr(const route_head *trk_head)
+{
+       (*cur_tx_tracklist_entry)->tnew = gpsTrue;
+       (*cur_tx_tracklist_entry)->ishdr = gpsTrue;
+       if ( trk_head->rte_name ) {
+               strncpy((*cur_tx_tracklist_entry)->trk_ident, trk_head->rte_name, sizeof((*cur_tx_tracklist_entry)->trk_ident));
+               (*cur_tx_tracklist_entry)->trk_ident[sizeof((*cur_tx_tracklist_entry)->trk_ident)-1] = 0;
+       }
+       cur_tx_tracklist_entry++;
+}
+
+static void
+track_waypt_pr(const waypoint *wpt)
+{
+       (*cur_tx_tracklist_entry)->lat = wpt->latitude;
+       (*cur_tx_tracklist_entry)->lon = wpt->longitude;
+       (*cur_tx_tracklist_entry)->alt = wpt->altitude;
+       (*cur_tx_tracklist_entry)->Time = wpt->creation_time;
+       if ( wpt->shortname ) {
+               strncpy((*cur_tx_tracklist_entry)->trk_ident, wpt->shortname, sizeof((*cur_tx_tracklist_entry)->trk_ident));
+               (*cur_tx_tracklist_entry)->trk_ident[sizeof((*cur_tx_tracklist_entry)->trk_ident)-1] = 0;
+       }
+       cur_tx_tracklist_entry++;
+}
+
+static void
+track_write(void)
+{
+       int i;
+        /* Headers plus trackpoints. Trackpoints are added by
+         * route_add_waypt so get route_waypt_count() 
+         */
+       int n = route_waypt_count() + track_count();
+
+       tx_tracklist = xcalloc(n, sizeof(GPS_PTrack));
+       cur_tx_tracklist_entry = tx_tracklist;
+
+       for (i = 0; i < n; i++) {
+               tx_tracklist[i] = GPS_Track_New();
+       }
+
+       track_disp_all(track_hdr_pr, route_noop, track_waypt_pr);
+
+       GPS_Command_Send_Track(portname, tx_tracklist, n);
+
+       for (i = 0; i < n; i++) {
+               GPS_Track_Del(&tx_tracklist[i]);
+       }
+       xfree(tx_tracklist);
+}
+
 static void
 data_write()
 {
@@ -464,8 +521,9 @@ data_write()
                case rtedata:
                        route_write();
                        break;
-               default:
-                       fatal(MYNAME ":writing tracks isn't supported\n");
+               case trkdata:
+                       track_write();
+                       break;
        }
 
 }
index 0c9f51d0c2e1326a6b674f647eb61eefd9dc77ea..512d95877e0265322c5a680d9fc3af7f3157dc31 100644 (file)
@@ -182,7 +182,7 @@ GPS_PTrack GPS_Track_New(void)
 {
     GPS_PTrack ret;
     
-    if(!(ret=(GPS_PTrack)malloc(sizeof(GPS_OTrack))))
+    if(!(ret=(GPS_PTrack)calloc(1,sizeof(GPS_OTrack))))
     {
        perror("malloc");
        fprintf(stderr,"GPS_Track_New: Insufficient memory");
index 3841d35213b2f5f64824666359662b023c00e614..70c6dd4eadf02492b9af6bb4da1bb9d5bb4ce9fc 100644 (file)
@@ -24,6 +24,7 @@ static queue my_route_head;
 static queue my_track_head;
 static int rte_head_ct;
 static int rte_waypts;
+static int trk_head_ct;
 
 void
 route_init(void)
@@ -45,6 +46,12 @@ route_count(void)
        return rte_head_ct;     /* total # of routes */
 }
 
+unsigned int
+track_count(void)
+{
+       return trk_head_ct;     /* total # of tracks */
+}
+
 route_head *
 route_head_alloc(void)
 {
@@ -68,6 +75,7 @@ track_add_head(route_head *rte)
 {
        ENQUEUE_TAIL(&my_track_head, &rte->Q);
        QUEUE_INIT(&rte->waypoint_list);
+       trk_head_ct++;
 }
 
 void